import { success, fail } from "../utils/base";
import {
  getBDCConfig,
  getOtherDbData,
  cleanExpiredData,
} from "../utils/lokijs-db-server";

/**
 * 从日志数据中提取各种指标的函数
 * @param logs - 日志数据数组
 * @returns 包含提取指标的对象
 */
function extractMetrics(logs: any) {
  // 初始化结果对象，包含各种指标
  const result: any = {
    trackerCount: 0, // 唯一的 sid 数量
    packageIdDistribution: {}, // packageId 分布
    actionTypeCount: {}, // 语言分布
    pagePath: {}, // 用户进入了哪些页面（PV）
    pagePath_UV: {}, // 用户进入了哪些页面（PV）
    pagePathAverageDuration: {}, // 进入了哪些页面的信息
    averageDurationTime: 0, // 所有页面 的平均持续时间
  };

  // 创建一个 Set 来存储唯一的 trackerId => sid
  const trackerSet = new Set();

  // 遍历日志数据数组
  logs.forEach((log: any) => {
    // 2. packageId 分布
    let packageId = log.authInfo?.packageId;
    packageId = packageId.split("-")[0] || "未知包名";
    result.packageIdDistribution[packageId] =
      (result.packageIdDistribution[packageId] || 0) + 1;

    // 3. 语言分布
    const areas = log.data?.areas || "en";
    result.actionTypeCount[areas] = (result.actionTypeCount[areas] || 0) + 1;

    // 4. 进入了哪些页面
    if (log.data?.cusData && log.data?.cusData.from.path) {
      let pageRoute = log.data?.cusData.from.path;
      let prefix = "";
      if (process.env.NODE_ENV != "development") {
        prefix = "/fx";
      }
      if (
        pageRoute.startsWith(prefix + "/zh_hk/") ||
        pageRoute.startsWith("/zh_hk/")
      ) {
        pageRoute = pageRoute.replace(prefix + "/zh_hk/", "/");
        pageRoute = pageRoute.replace("/zh_hk/", "/");
      } else if (
        pageRoute.startsWith(prefix + "/in_en/") ||
        pageRoute.startsWith("/in_en/")
      ) {
        pageRoute = pageRoute.replace(prefix + "/in_en/", "/");
        pageRoute = pageRoute.replace("/in_en/", "/");
      } else if (
        pageRoute.startsWith(prefix + "/indonesia/") ||
        pageRoute.startsWith("/indonesia/")
      ) {
        pageRoute = pageRoute.replace(prefix + "/indonesia/", "/");
        pageRoute = pageRoute.replace("/indonesia/", "/");
      } else if (
        pageRoute.startsWith(prefix + "/ph/") ||
        pageRoute.startsWith("/ph/")
      ) {
        pageRoute = pageRoute.replace(prefix + "/ph/", "/");
        pageRoute = pageRoute.replace("/ph/", "/");
      } else if (
        pageRoute.startsWith(prefix + "/pt/") ||
        pageRoute.startsWith("/pt/")
      ) {
        pageRoute = pageRoute.replace(prefix + "/pt/", "/");
        pageRoute = pageRoute.replace("/pt/", "/");
      } else if (
        pageRoute.startsWith(prefix + "/VI/") ||
        pageRoute.startsWith("/VI/")
      ) {
        pageRoute = pageRoute.replace(prefix + "/VI/", "/");
        pageRoute = pageRoute.replace("/VI/", "/");
      } else if (
        pageRoute.startsWith(prefix + "/mys/") ||
        pageRoute.startsWith("/mys/")
      ) {
        pageRoute = pageRoute.replace(prefix + "/mys/", "/");
        pageRoute = pageRoute.replace("/mys/", "/");
      } else if (
        pageRoute.startsWith(prefix + "/en/") ||
        pageRoute.startsWith("/en/")
      ) {
        pageRoute = pageRoute.replace(prefix + "/en/", "/");
        pageRoute = pageRoute.replace("/en/", "/");
      } else if (pageRoute.startsWith(prefix + "/")) {
        pageRoute = pageRoute.replace(prefix + "/", "/");
      }
      // PV
      result.pagePath[pageRoute] = Number(result.pagePath[pageRoute] || 0) + 1;
      // UV
      if (!trackerSet.has(log.authInfo.trackerId)) {
        result.pagePath_UV[pageRoute] =
          Number(result.pagePath_UV[pageRoute] || 0) + 1;
      } else {
        result.pagePath_UV[pageRoute] = 1;
      }

      // durationTime 统计
      const duration = log.data?.durationTime || 0;

      // 累加所有页面的 durationTime 停留时长； 用于计算每个用户的平均停留时长
      result.averageDurationTime += duration;

      // 各种 路由 的平均持续时间
      if (!result.pagePathAverageDuration[pageRoute]) {
        // 如果 路由 不存在，则初始化一个新的对象
        result.pagePathAverageDuration[pageRoute] = {
          total: 0,
          count: 0,
          path: pageRoute,
        };
      }
      // 累加当前 路由 的总持续时间
      result.pagePathAverageDuration[pageRoute].total += duration;
      // 增加当前 路由 的计数
      result.pagePathAverageDuration[pageRoute].count += 1;
    }

    // 5. 统计 sid
    if (log.authInfo && log.authInfo.trackerId) {
      // 将 trackerId 添加到 Set 中
      trackerSet.add(log.authInfo.trackerId);
    }
  });

  // 计算唯一的 trackerId 数量
  result.trackerCount = trackerSet.size;
  // 计算单个用户，在整个项目的停留时间
  result.averageDurationTime =
    logs.length > 0
      ? (result.averageDurationTime / result.trackerCount).toFixed(2)
      : 0;

  // 计算各 每个页面的 的平均持续时间
  for (const [actionType, data] of Object.entries(
    result.pagePathAverageDuration
  )) {
    // 计算平均持续时间并保留两位小数
    result.pagePathAverageDuration[data.path] = (
      data.total / data.count
    ).toFixed(2);
  }

  // 返回包含所有提取指标的结果对象

  return result;
}

/**
 * @description: 查询指标
 */
export default defineEventHandler(async (event) => {
  // 获取请求参数 post
  const body = await readBody(event);
  // const { res } = event.node;

  if (event.node.req.method === "OPTIONS") {
    return fail("暂不支持");
  }

  // 1. 读取配置文件
  const { configData, configPath } = getBDCConfig();

  // 3. 获取 LokiJS 实例
  const db = event.context.db;
  console.log("💾 当前使用的数据库名称:", db.filename);

  let instanceList: any = [];
  let dbCurConfig: any = {}; // 当前实例的配置
  if (configData.dbs && configData.dbs.length > 0) {
    configData.dbs.forEach((e: any) => {
      if (e.path != db.filename) {
        instanceList.push(e);
        console.log("3.1 查询数据库:", e.path);
      } else {
        dbCurConfig = e;
      }
    });
  }

  // 读取文件数据
  if (db) {
    const pagePuv = db.getCollection("pagePuv");
    if (pagePuv === null) {
      db.addCollection("pagePuv");
      return fail("pagePuv 集合不存在,开始初始化数据");
    } else {
      cleanExpiredData(pagePuv);
    }
    // 深拷贝
    let puvData = JSON.parse(JSON.stringify(pagePuv));

    // 获取其他数据源
    const { data: otherDatas } = (await getOtherDbData(
      instanceList,
      "pagePuv"
    )) as any;

    // console.log(
    //   puvData.data.length,
    //   "获取其他数据源 otherDatas:",
    //   otherDatas.length
    // );
    let totalData = puvData.data.concat(otherDatas);

    const metrics = extractMetrics(totalData);

    // 返回数据
    return success({
      list: totalData,
      total: totalData.length,
      metrics: metrics,
    });
  } else {
    return fail("db 实例为初始化,数据为空");
  }
});
